package logica;

import java.util.List;

import logica.persistencia.AtributoPersistente;
import memento.EstadoGuardable;
import memento.IMemento;

public abstract class Atributo implements EstadoGuardable {

	private String nombre;
	private int cardinalidadMin;
	private int cardinalidadMax;
	
	private static final String CARDINALIDAD_MAXIMA_STR = "n";
	public static final int CARDINALIDAD_MAXIMA_INT = -1;
	
	public Atributo(String nombre) throws SinNombreException
	{
		this.setNombre(nombre);
		this.setCardinalidadMin(1);
		this.setCardinalidadMax(-1);
	}
	
	public abstract void agregarAtributo(Atributo atributo) throws AtributoRepetidoException, AtributoSimpleException;
	
	public abstract void agregarAtributos(List<Atributo> atributos) throws AtributoRepetidoException, AtributoSimpleException;
	
	public abstract List<Atributo> getAtributos() throws AtributoSimpleException;
	
	public boolean equals(Object atributo)
	{
		return ((Atributo)atributo).getNombre().compareToIgnoreCase(this.getNombre())==0;		
	}

	public void setNombre(String nombre) throws SinNombreException 
	{
		if (nombre.isEmpty())
			throw new SinNombreException("Un atributo tiene que tener un nombre.");
		
		this.nombre = nombre;
	}

	public String getNombre() {
		return nombre;
	}
	
	public String toString(){
		return this.getNombre();
	}

	public void setCardinalidad(int cardinalidadMin, int cardinalidadMax)
	{
		this.setCardinalidadMin(cardinalidadMin);
		this.setCardinalidadMax(cardinalidadMax);
	}
	
	public void setCardinalidadMin(int cardinalidadMin) {
		this.cardinalidadMin = cardinalidadMin;
	}

	public int getCardinalidadMin() {
		return cardinalidadMin;
	}

	public void setCardinalidadMax(int cardinalidadMax) {
		this.cardinalidadMax = cardinalidadMax;
	}

	public int getCardinalidadMax() {
		return cardinalidadMax;
	}

	public void setCardinalidadMin(String cardinalidadMin) throws NumberFormatException
	{	
		if (esCardinalidadMaxima(cardinalidadMin))
			this.setCardinalidadMin(this.getValorCardinalidadMaximaInt());
		else
			this.setCardinalidadMin(new Integer(cardinalidadMin));
	}
	
	public void setCardinalidadMax(String cardinalidadMax)
	{
		if (esCardinalidadMaxima(cardinalidadMax))
			this.setCardinalidadMax(this.getValorCardinalidadMaximaInt());
		else
			this.setCardinalidadMax(new Integer(cardinalidadMax));
	}

	private boolean esCardinalidadMaxima(String cardinalidad) {
		return (cardinalidad.compareToIgnoreCase(CARDINALIDAD_MAXIMA_STR) == 0);
	}
	
	private int getValorCardinalidadMaximaInt() {
		return CARDINALIDAD_MAXIMA_INT;
	}
	
	public String getCardinalidadMinString()
	{
		if (this.getCardinalidadMin() == this.getValorCardinalidadMaximaInt())
			return CARDINALIDAD_MAXIMA_STR;
		
		return Integer.toString(this.getCardinalidadMin());
	}

	public String getCardinalidadMaxString() 
	{
		if (this.getCardinalidadMax() == this.getValorCardinalidadMaximaInt())
			return CARDINALIDAD_MAXIMA_STR;
		
		return Integer.toString(this.getCardinalidadMax());
	}
	
	public abstract AtributoPersistente getAtributoPersistente();
	

	@Override
	public void saveMemento(IMemento memento) {
		memento.cargarMemento();
	}
	
	@Override
	public IMemento getMementoGenerico() {
		return this.getMementoEspecializado();
	}
}
